package com.ganbo.pattern.flyweight;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * 内存池/内存工厂
 *
 * @Author: ganbo
 * @Date: 2020/6/12 12:32
 */
public class MemoryPool {

    private static List<Memory> memories = new ArrayList<Memory>();

    /**
     * 获取指定大小的内存
     *
     * @param size 需要的内存大小
     */
    public static Memory getMemmory(int size) {
        Memory memory = null;
        for (int i = 0; i < memories.size(); i++) {
            memory = memories.get(i);
            //付过缓存中存在和需求大小size相同并且未使用过的内存块，就直接返回
            if (memory.getSize() == size && !memory.isUsed()) {
                memory.setUsed(true);
                memories.set(i, memory);
                System.out.println("获取内存->来至于缓存。");
                break;
            }
        }

        //如果缓存中的内存不存在，则从系统中新申请内存返回，并将该内存加入内存对象列表中管理
        if (memory == null) {
            memory = new Memory(UUID.randomUUID().toString(), size, true);
            System.out.println("获取内存->来至于系统新的开销。");
            memories.add(memory);
        }
        return memory;
    }

    /**
     * 释放内存
     *
     * @param id 要释放的内存id
     */
    public static void releaseMemory(String id) {
        for (int i = 0; i < memories.size(); i++) {
            Memory memory = memories.get(i);
            if (memory.getId().equals(id)) {
                memory.setUsed(false);
                memories.set(i, memory);
                System.out.println("释放内存,id：" + id);
                break;
            }
        }
    }

}
